//
//  Vista.h
//  PEI
//
//  Created by asc on 10/03/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#ifndef PEI_Vista_h
#define PEI_Vista_h

#include "../Modelo/Modelo.h"
#include "../Modelo/Modelo_Casilla.h"
#include "../Modelo/Modelo_Tablero.h"
#include "../Modelo/Modelo_Variantes.h"




class Modelo;

/*!
 * \class Vista
 * \brief Es la clase base de las vistas en este ejemplo.
 */
class Vista
{
    // Parte publica
public:
    
    /*! 
     * \brief Constructor por defecto.
     *
     * El modelo sera nulo
     */
    Vista() { su_modelo = 0; }
    
    /*! 
     * \brief Constructor por defecto.
     *
     * \param m El modelo con el que se asocia esta vista.
     */
    Vista(Modelo& m);
    //! Constructor de copia
    Vista(const Vista& una_vista);
    
    //! Destructor
    ~Vista();
    
    //! Asignacion
    Vista & operator =(const Vista& una_vista);
    
    //! Cambiamos el modelo asociado.
    void poner_modelo (Modelo* m);
    
    /*! 
     * \brief ActualizaciÛn de la vista ordenada por el modelo.
     *
     * Es virtual pura ya que son las vistas derivadas de esta clase las
     * que deben saber cÛmo actualizarse.
     */
    virtual void actualizar() = 0;
    
    /*!
     * \brief Actualizacion del modelo ordenada por la vista.
     *
     * Tiene sentido cuando el usuario actuando sobre la vista modifica
     * datos que han de reflejarse posteriormente en el modelo.
     *
     * Por defecto le dice al modelo que actualice sus otras posibles
     * vistas sobre el. Tiene sentido que se llame en ultimo lugar
     * dentro del propio metodo redefinido en una clase derivada.
     */
    virtual void actualizar_modelo();
    
    // Parte protegida
protected:
    //! El modelo al que se asocia esta vista.
    Modelo* su_modelo;
    
    // Parte privada
private:
    
};

/*
class Vista {
    
public:
    Vista(){};
    virtual void MuestraTablero(vector<casilla> table, int rows);
    virtual void MuestraInfo(variantes* var);
};
*/
#endif
